from flask import Blueprint, request, jsonify
from flask_jwt_extended import get_jwt_identity, jwt_required
from app import db, LogService
from app.models.order_lib import generateOrder, Order
from presenter.order import OrderPresenter
from utils import create_response, StateCode
from utils.server import verifyOrderPayment

order_bp = Blueprint('order', __name__)


# 导入必要的模块和依赖项（假设这些模块已在其他地方定义）

@order_bp.route('/orders', methods=['POST'])  # 定义路由，处理创建订单的 POST 请求
@jwt_required()  # 验证用户身份，确保请求中包含有效的 JWT Token
def createOrder():
    current_user = get_jwt_identity()  # 获取当前用户的唯一标识（JWT 的 payload 中的身份信息）
    data = request.json  # 获取请求体中的 JSON 数据
    new_order = generateOrder(data, current_user)  # 调用函数生成新订单对象
    db.session.add(new_order)  # 将新订单添加到数据库会话中
    db.session.commit()  # 提交数据库事务，保存订单
    order_presenter = OrderPresenter(new_order).as_dict()  # 将订单对象转换为可序列化的字典格式
    LogService.log()  # 记录日志
    return jsonify(create_response(StateCode.SUCCESS, data=order_presenter)), 200  # 返回成功响应，包含订单数据


@order_bp.route('/orders/<string:order_no>/query_payment', methods=['POST'])  # 定义路由，处理查询支付状态的 POST 请求
@jwt_required()  # 验证用户身份
def queryPayment(order_no):
    current_user = get_jwt_identity()  # 获取当前用户的唯一标识
    response = verifyOrderPayment(order_no)  # 调用函数验证订单支付状态
    if response.status_code == 200 and response.json().get("data")["state"] == "successful":
        # 如果支付状态为成功
        order = Order.setOrderState(order_no, current_user,
                                    state=1, payment_time=response.json().get("data")["pay_time"])
        # 更新订单状态为已支付，并记录支付时间
        order_presenter = OrderPresenter(order).as_dict()  # 将更新后的订单对象转换为字典格式
        LogService.log()  # 记录日志
        return jsonify(create_response(StateCode.SUCCESS, data=order_presenter)), 200  # 返回成功响应
    else:
        # 如果支付状态不成功
        LogService.log()  # 记录日志
        return jsonify(create_response(StateCode.ORDER_PAY_ERROR)), 400  # 返回支付失败的错误响应


@order_bp.route('/orders', methods=['GET'])  # 定义路由，处理查询订单列表的 GET 请求
@jwt_required()  # 验证用户身份
def queryOrder():
    state = request.args.get("state")  # 从请求参数中获取订单状态
    current_user = get_jwt_identity()  # 获取当前用户的唯一标识
    orders = Order.query.filter(Order.passenger_id == current_user, Order.state == state).all()
    # 查询当前用户的所有符合条件的订单（根据乘客 ID 和订单状态过滤）
    order_presenter = [OrderPresenter(order).as_dict() for order in orders]
    # 将每个订单对象转换为字典格式
    LogService.log()  # 记录日志
    return jsonify(create_response(StateCode.SUCCESS, data=order_presenter)), 200  # 返回成功响应，包含订单列表
